Hi all~~~, 由於一時腦霧忘記補上上篇的應用案例,於是在這篇補上。
案例背景:目前有間Apple電腦代工廠,然後他目前生產了三種類的電腦,分別是:"MacBook Pro", "MacBook Air" 以及 "MacBook",而他的發售順序也是由 MacBook Pro 依序至 MacBook。
在此案例中,我們拉出了三個list作爲物件池負責存放物件,分別是:
package Labtop
import "sync"
type Labtop struct {
Name string
}
type LabtopPool struct {
sync.Mutex
NotYetFashion []*Labtop
OnFashion []*Labtop
OldFashion []*Labtop
}
func InitLabtopPool(notYetFashion []*Labtop) *LabtopPool {
return &LabtopPool{NotYetFashion: notYetFashion}
}
func (p *LabtopPool) AddToFashionList() {
p.Lock()
labtop := p.NotYetFashion[0]
if len(p.OnFashion) != 0 {
labotopNeedRetired := p.OnFashion[0]
p.AddToOldFashionList(labotopNeedRetired)
p.OnFashion = append(p.OnFashion[:0], p.OnFashion[1:]...)
}
p.OnFashion = append(p.OnFashion, labtop)
p.NotYetFashion = append(p.NotYetFashion[:0], p.NotYetFashion[1:]...)
p.Unlock()
}
func (p *LabtopPool) AddToOldFashionList( labotopNeedRetired *Labtop) {
if len(p.OldFashion) != 0 {
p.OldFashion = append(p.OldFashion[:0], p.OldFashion[1:]...)
}
p.OldFashion = append(p.OldFashion, labotopNeedRetired)
}
package main
import (
"fmt"
Pool "test/labtopPool"
)
func main() {
labtopPool := Pool.InitLabtopPool([]*Pool.Labtop{
{Name: "MacBook Pro"},
{Name: "MacBook Air"},
{Name: "MacBook"},
})
labtopPool.AddToFashionList()
labtopPool.AddToFashionList()
fmt.Println("OnFashion: ", labtopPool.OnFashion[0].Name, " Length: ", len(labtopPool.OnFashion))
fmt.Println("OldFashion: ", labtopPool.OldFashion[0].Name, " Length: ", len(labtopPool.OldFashion))
fmt.Println("NotYetFashion: ", labtopPool.NotYetFashion[0].Name, " Length: ", len(labtopPool.NotYetFashion))
}
在這個範例中,我們成功地創建了一個LabtopPool結構,該結構用於管理一系列的Labtop物件,分為三個階段:即將販售(NotYetFashion)、販售中(OnFashion)和將淘汰(OldFashion)。
LabtopPool結構內的方法 AddToFashionList 和 AddToOldFashionList 主要是將一個列表移到另一個列表,從而類似於這間Apple電腦代工廠的產品生命週期。此外,透過使用 sync.Mutex,確保了在多線程環境中對該結構的安全訪問,避免了可能的競爭條件。